ภาควิชาวิจัยและจิตวิทยาการศึกษา
คณะครุศาตร์ จุฬาลงกรณ์มหาวิทยาลัย

Modeling Process

กระบวนการพัฒนาการเรียนรู้ของเครื่องนั้น มีลักษณะคล้ายคลึงกับการวิเคราะห์ข้อมูลเชิงสำรวจ (exploratory data analysis: EDA) กล่าวคือเป็นกระบวนการที่ไม่ทราบคำตอบหรือวิธีการดำเนินงานที่แน่นอน และมักต้องมีการดำเนินการทวนซ้ำจนกระทั่งได้ผลลัพธ์เป็นที่น่าพึงพอใจ

Data Splitting

  • วัตถุประสงค์หลักในการเรียนรู้ของเครื่อง คือ การพัฒนาอัลกอริทึม \(f(X)\) ที่สามารถทำนายผลลัพธ์ \(Y\) ของหน่วยข้อมูลที่สนใจได้อย่างแม่นยำมา

  • นอกจากนี้ผู้วิเคราะห์ยังไม่ได้สนใจเพียงแต่ความแม่นยำของการทำนายภายใต้ชุดข้อมูลที่นำมาวิเคราะห์เท่านั้น ยังสนใจความแม่นยำของการทำนายหน่วยข้อมูลที่เครื่องไม่รู้จักกล่าวคืออยู่นอกเหนือจากชุดข้อมูลที่นำมาวิเคราะห์ด้วย เรียกคุณสมบัตินี้ว่า generaliability

  • การจะประเมินว่าโมเดลทำนายของผู้วิเคราะห์มีคุณสมบัติ generalizability มากน้อยเพียงใด ไม่สามารถประเมินได้จากข้อมูลเพียงชุดเดียว ในการดำเนินงานจึงมีการแบ่งข้อมูลออกเป็นสองส่วน เรียกว่า ชุดข้อมูลฝึกหัด (training datset) และชุดข้อมูลทดสอบ (test dataset)

Data Splitting

ชุดข้อมูลฝึกหัด เป็นชุดข้อมูลที่ผู้วิเคราะห์จะนำไปใช้สำหรับพัฒนาโมเดลที่ดีที่สุด โดยเริ่มตั้งแต่ขั้นตอนการคัดเลือกตัวแปรทำนาย สร้างโมเดลทำนาย ปรับแต่ง hyperparameters ของโมเดลทำนาย เปรียบเทียบและคัดเลือกชุดของโมเดลที่ดีที่สุดที่จะนำไปแข่งขันกันในชุดข้อมูลทดสอบ การเปรียบเทียบโมเดลบนชุดข้อมูลทดสอบช่วยให้ผู้วิเคราะห์พิจารณาได้ว่าโมเดลใดเป็นโมเดลที่มี generalization error ต่ำที่สุด และควรถูกเลือกไปใช้งาน

Data Splitting

โดยปกติแล้วผู้วิเคราะห์มักแบ่งข้อมูลออกเป็นชุดข้อมูลฝึกหัดกับชุดข้อมูลทดสอบด้วยอัตราส่วน 60:40, 70:30 หรือ 80:20 อย่างไรก็ตามตัวเลขดังกล่าวไม่ใช่เกณฑ์ตายตัวเสมอไป

  • หากให้ชุดข้อมูลฝึกหัดมีขนาดใหญ่มากเกินไป —> จะทำให้ชุดข้อมูลทดสอบมีขนาดเล็กเกินไป ส่งผลให้การประมาณ generalization error มีความคลาดเคลื่อนหรือไม่สะท้อนสภาพจริง เพิ่มโอกาสที่ผู้วิเคราะห์จะได้โมเดลที่สอดคล้องกับข้อมูลเกินพอดี (overfitting)

  • ในทางกลับกันหากใช้ข้อมูลทดสอบมีขนาดใหญ่มากเกินไป —> จะทำให้ชุดข้อมูลฝึกหัดมีขนาดเล็กและอาจไม่เพียงพอที่จะพัฒนาโมเดลทำนายให้มีประสิทธิภาพสูงที่สุดตามที่ควรจะเป็นได้ ซึ่งเพิ่มโอกาสที่จะได้โมเดลที่ไม่สอดคล้องกับข้อมูล (underfitting)

อีกปัจจัยหนึ่งที่สามารถใช้สำหรับพิจารณาขนาดของชุดข้อมูล training และ test คือขนาดข้อมูลในภาพรวม เช่นในกรณีที่ชุดข้อมูลมีขนาดใหญ่มาก ผู้วิเคราะห์อาจเลือกกำหนดชุดข้อมูลฝึกหัดให้มีขนาดเล็กลง ทั้งนี้เพื่อประหยัดทรัพยากรในขั้นตอนของการพัฒนาโมเดล อย่างไรก็ตามจำนวนข้อมูลขั้นต่ำควรมีจำนวนมากกว่าจำนวนของตัวแปรทำนาย

Data Splitting

  • Simple Splitting based on Outcome

  • Stratified Splitting based on Outcome

  • Splitting Based on the Predictors

Simple Splitting based on Outcome

## importing data
dat<-read.csv(file="housing.csv")
glimpse(dat)
## Rows: 20,640
## Columns: 10
## $ longitude          <dbl> -122.23, -122.22, -122.24, -122.25, -122.25, -122.2…
## $ latitude           <dbl> 37.88, 37.86, 37.85, 37.85, 37.85, 37.85, 37.84, 37…
## $ housing_median_age <dbl> 41, 21, 52, 52, 52, 52, 52, 52, 42, 52, 52, 52, 52,…
## $ total_rooms        <dbl> 880, 7099, 1467, 1274, 1627, 919, 2535, 3104, 2555,…
## $ total_bedrooms     <dbl> 129, 1106, 190, 235, 280, 213, 489, 687, 665, 707, …
## $ population         <dbl> 322, 2401, 496, 558, 565, 413, 1094, 1157, 1206, 15…
## $ households         <dbl> 126, 1138, 177, 219, 259, 193, 514, 647, 595, 714, …
## $ median_income      <dbl> 8.3252, 8.3014, 7.2574, 5.6431, 3.8462, 4.0368, 3.6…
## $ median_house_value <dbl> 452600, 358500, 352100, 341300, 342200, 269700, 299…
## $ ocean_proximity    <chr> "NEAR BAY", "NEAR BAY", "NEAR BAY", "NEAR BAY", "NE…

Simple Splitting based on Outcome

ggplot(dat, aes(x=median_house_value))+
    geom_histogram(aes(y=..density..),
                   col="black",
                   fill="white")+
    geom_density(col="blue")+
    ggtitle("Distribution of `median_house_value`")+
    theme_minimal()

Simple Splitting based on Outcome

การแบ่งข้อมูลตามตัวแปรตามด้วยวิธีการสุ่มอย่างง่ายใน R สามารถทำได้หลายวิธี วิธีการหนึ่งที่สามารถทำได้คือการใช้ฟังก์ชัน createDataPartition() ของ package-caret

set.seed(123)
## splitting data
train.id<-createDataPartition(dat$median_house_value, 
                              p=0.8, 
                              list=FALSE,
                              times=1) 
train.dat<-dat[train.id,]
test.dat<-dat[-train.id,]

Simple Splitting based on Outcome

รูปต่อไปนี้เปรียบเทียบการแจกแจงของ median_house_value ระหว่างชุดข้อมูลใหญ่ ชุดข้อมูลฝึกหัด และชุดข้อมูลทดสอบที่สร้างด้วยฟังก์ชัน createDataPartition()

Stratified Splitting based on Outcome

  • การสุ่มแบบ simple random sampling สามารถใช้ได้ดีในกรณีที่หน่วยข้อมูลมีความเป็นเอกพันธ์กัน (homogenous) แต่หากหน่วยข้อมูลมีความแตกต่างกันสูง (heterogenous) การสุ่มแบบ SRS อาจไม่สามารถรับประกันได้ว่าจะได้ชุดข้อมูลที่มีลักษณะสอดคล้องกัน

  • อีกสถานการณ์หนึ่งคือในปัญหา classification ตัวแปรตามที่ใช้ในการวิเคราะห์อาจมีความไม่สมดุลกันในแต่ละ category (imbalance class) เช่น นักเรียนที่คงอยู่ในระบบการศึกษามี 90% ส่วนนักเรียนที่ออกกลางคันจากระบบการศึกษามี 10% การใช้ SRS ในกรณีเช่นนี้อาจทำให้ผู้วิเคราะห์ได้หน่วยข้อมูลที่มีีคุณลักษณะไม่ครบถ้วน

  • กรณีดังกล่าวการสุ่มตัวอย่างแบบชั้นภูมิอาจให้ชุดข้อมูลฝึกหัดและชุดข้อมูลทดสอบที่มีความเหมาะสมมากกว่า การสุ่มแบบชั้นภูมิใน R สามารถทำได้หลายวิธี วิธีการหนึ่งคือการใช้ฟังก์ชัน initial_split() ใน package-rsample ดังตัวอย่างต่อไปนี้

Stratified Splitting based on Outcome

กรณีที่ตัวแปรตามเป็นตัวแปรต่อเนื่อง การสุ่มตัวอย่างจะเริ่มจากการแบ่งข้อมูลของตัวแปรตามออกเป็นส่วนย่อย ๆ ตามค่า quantile ก่อน แล้วจึงสุ่มหน่วยข้อมูลจากแต่ละช่วงด้วยวิธีการสุ่มอย่างง่าย

Stratified Splitting based on Outcome

library(rsample)

set.seed(123)
strat_split<-initial_split(dat, 
                        prop=0.8,
                        strata="median_house_value")
str_train<-training(strat_split)
str_test<-testing(strat_split)

Stratified Splitting based on Outcome

เปรียบเทียบการแจกแจงระหว่าง training กับ test datasest

summary(str_train$median_house_value)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   14999  119600  179700  206591  264775  500001
summary(str_test$median_house_value)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   14999  119550  179650  207914  264700  500001

Stratified Splitting based on Outcome

เปรียบเทียบการแจกแจงระหว่าง training กับ test datasest

Stratified Splitting based on Outcome

กรณีที่ตัวแปรตามเป็นตัวแปรจัดประเภท จะสุ่มหน่วยข้อมูลจากแต่ละ category ในตัวแปรตาม โดยใช้สัดส่วนของ category เป็นเกณฑ์

## Rows: 150
## Columns: 5
## $ Sepal.Length <dbl> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.…
## $ Sepal.Width  <dbl> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.…
## $ Petal.Length <dbl> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.…
## $ Petal.Width  <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.…
## $ Species      <fct> setosa, setosa, setosa, setosa, setosa, setosa, setosa, s…
## 
##     setosa versicolor  virginica 
##         50         50         50

Stratified Splitting based on Outcome

การแบ่งข้อมูลโดยใช้การสุ่มแบบชั้นภูมิใน R สามารถทำได้หลายวิธีการเช่นเดียวกัน วิธีการหนึ่งที่สามารถทำได้คือการใช้ฟังก์ชัน initial_split() ของ package-rsample ดังตัวอย่างด้านล่าง

set.seed(123)
strat_split<-initial_split(iris, 
                        prop=0.7,
                        strata="Species")
str_train<-training(strat_split)
str_test<-testing(strat_split)

Stratified Splitting based on Outcome

table(str_train$Species)%>%prop.table()
## 
##     setosa versicolor  virginica 
##  0.3333333  0.3333333  0.3333333
table(str_test$Species)%>%prop.table()
## 
##     setosa versicolor  virginica 
##  0.3333333  0.3333333  0.3333333

Splitting Based on the Predictors

การแบ่งข้อมูลลักษณะนี้จะใช้อัลกอริทึม maximum dissimilarity หรือ maxDissim (Willett, 1999)กำหนดให้ A เป็นชุดข้อมูลตั้งต้น (initial dataset) ขนาด m หน่วย และ B เป็นชุดข้อมูลรวมขนาด n หน่วย โดยที่ \(n > m\)

อัลกอริทึม maxDissim จะสุ่มเลือกหน่วยข้อมูลใน B โดยพิจารณาให้มีความแตกต่าง (disimilarity) กับหน่วยข้อมูลในชุดข้อมูล A มากที่สุด

Splitting Based on the Predictors

#standardized quantitative variables
dat.all<-data.frame(scale(iris[,1:4],center=TRUE,scale=TRUE))
glimpse(dat.all)
## Rows: 150
## Columns: 4
## $ Sepal.Length <dbl> -0.89767388, -1.13920048, -1.38072709, -1.50149039, -1.01…
## $ Sepal.Width  <dbl> 1.01560199, -0.13153881, 0.32731751, 0.09788935, 1.245030…
## $ Petal.Length <dbl> -1.335752, -1.335752, -1.392399, -1.279104, -1.335752, -1…
## $ Petal.Width  <dbl> -1.3110521, -1.3110521, -1.3110521, -1.3110521, -1.311052…

Splitting Based on the Predictors

set.seed(123)
initial.id<-sample(1:dim(dat.all)[1],5)
A.set<-dat.all[initial.id,] #initial dataset
B.set<-dat.all[-initial.id,] #larger dataset

## maxDissim dataset
maxdis.dat<-maxDissim(A.set, B.set, n=50)
maxdis.dat<-B.set[maxdis.dat,]

Class Imbalances Problem

ปัญหาข้อมูลไม่สมดุล (class imbalance problem) เป็นปัญหาที่พบใน classification problem ปัญหานี้เป็นปัญหาสำคัญที่ส่งผลเสียที่ค่อนข้างรุนแรงต่อประสิทธิภาพในการทำนายของโมเดล

  • biased predictions

  • misleading accuracy

เมื่อเกิดปัญหาข้อมูลไม่สมดุล จำนวนหน่วยข้อมูลใน category ของตัวแปรตามอย่างน้อย 2 category มีความแตกต่างกันมากเกินไป เช่นตัวอย่างชุดข้อมูลต่อไปนี้

dropout<-read.csv(file="dropout.csv")
table(dropout$Class)%>%prop.table()
## 
##           0           1 
## 0.998272514 0.001727486

โดยที่ Class=1 คือกลุ่มนักเรียนที่ออกกลางคัน

Class Imbalances Problem

การแก้ปัญหา class imbalances สามารถทำได้หลายวิธี โดยแต่ละวิธีมีวัตถุประสงค์เดียวกันคือพยายามปรับสมดุลของข้อมูลให้แต่ละ class มีจำนวนหน่วยข้อมูลที่ใกล้เคียงกันก่อนนำไปวิเคราะห์ วิธีการที่มักใช้กันโดยทั่วไป เช่น

  • up-sampling (increasing minority class)

  • down-sampling (decreasing majority class)

  • hybrid methods —> SMOTE, ROSE

Up-sampling (Oversampling)

สมมุติให้ A เป็น majority class และ B เป็น minority class วิธี up-sampling จะใช้การสุ่มตัวอย่างแบบใส่คืน (sampling with replacement) สุ่มหน่วยข้อมูลจาก class B เพื่อใส่กลับคืนไปยัง class B เพื่อให้จำนวนหน่วยข้อมูลใน minority class มีขนาดเท่ากับจำนวนหน่วยข้อมูลใน majority class

การทำ up-sampling ใน R วิธีการหนึ่งสามารถทำได้โดยใช้ฟังก์ชัน upSample() ของ package-caret

Down-sampling (Undersampling)

เป็นวิธีการตรงกันข้ามกับ up-sampling โดยใช้การสุ่มตัวอย่างจาก class อื่นลงมาให้มีขนาดเท่ากับ minority class

การทำ down-sampling สามารถทำได้โดยใช้ฟังก์ชัน downSample() ของ package-caret

Up-sampling and Down-sampling

set.seed(938)
subset<-sample(1:dim(dropout)[1], 0.04*dim(dropout)[1])
subset<-dropout[subset,]
subset$Class<-factor(subset$Class)

dim(subset)
## [1] 11392    31
table(subset$Class)
## 
##     0     1 
## 11374    18

Up-sampling and Down-sampling

train.id<-createDataPartition(subset$Class, p=0.8, list=FALSE, times=1)
train.dat<-subset[train.id,]
test.dat<-subset[-train.id,]

train.up<-upSample(x = train.dat%>%select(-Class),
                   y = train.dat$Class)
table(train.up$Class)
## 
##    0    1 
## 9100 9100
train.down<-downSample(x = train.dat%>%select(-Class),
                   y = train.dat$Class)
table(train.down$Class)
## 
##  0  1 
## 15 15

Up-sampling and Down-sampling

  • จะเห็นว่า down-sampling เป็นวิธีการที่ทำให้ผู้วิเคราะห์สูญเสียข้อมูล ซึ่งอาจส่งผลต่อความตรงของโมเดลทำนาย และทำให้การทำนายผลลัพธ์ที่สนใจมีความลำเอียงหรือคลาดเคลื่อนไปจากความเป็นจริง

  • ส่วน up-sampling ไม่ได้ทำให้เกิดการสูญเสียข้อมูล แต่อาจก่อให้เกิดปัญหา overfitting เนื่องจากโมเดลเรียนรู้จากข้อมูลเดิม ๆ ซ้ำ ๆ มากเกินไป

SMOTE

การแก้ปัญหาข้างต้นสามารถทำได้หลายวิธีการ วิธีการหนึ่งคือการใช้อัลกอริทึม SMOTE (Chawla et al., 2002) หลักการของวิธีการนี้คล้ายกับ up-sampling ในส่วนที่จะพยายามทำให้กลุ่ม minority มีจำนวนหน่วยข้อมูลที่ใกล้เคียงหรือเท่ากับกลุ่ม majority แต่หลีกเลี่ยงการใช้ข้อมูลซ้ำแบบ up-sampling ด้วยการสร้าง systhetic observation ขึ้นมาแทน

Before SMOTE

ggplot(subset)+geom_point(aes(x=V1, y=V2, col=Class), alpha=0.5)+
  theme_minimal()

Doing SMOTE

#install.packages("smotefamily")
library(smotefamily)

set.seed(123)
train.smote<-SMOTE(X = train.dat%>%select(-Class),
      target = train.dat$Class,
      K=5)
train.smote<-train.smote$data
train.smote$class<-factor(train.smote$class)

After SMOTE

Other Methods

นอกจาก SMOTE ยังมีเทคนิคอื่น ๆ อีกหลายตัวที่ใช้แก้ปัญหา imbalance class ได้ เช่น

  • Adaptive Synthetic Sampling (ADASYN)

  • Adaptive Neighbor Synthetic Majority Oversampling (ANS)

  • Borderline-SMOTE

  • Density-based SMOTE

  • Safe-level SMOTE

Imbalance Class

Model Training

  • การพัฒนาโมเดลเป็นกระบวนการเลือก/กำหนดโมเดลทางคณิตศาสตร์ให้กับข้อมูล ประมาณ/กำหนดค่าพารามิเตอร์ภายในโมเดล เพื่อให้ได้โมเดลที่มีความสอดคล้องกับข้อมูลมากที่สุด และสามารถใช้เป็นโมเดลทำนายค่าสังเกตของตัวแปรตามได้แม่นยำมากที่สุด

  • พารามิเตอร์ภายในโมเดลอาจจำแนกเป็นสองประเภท ประเภทแรกเรียกว่า พารามิเตอร์ (parameters) สามารถหาค่าที่เหมาะสมได้จากการประมาณค่าทางสถิติ ซึ่งจะใช้ฟังก์ชันวัตถุประสงค์ (objective functions) หรือฟังก์ชันต้นทุน (cost functions) หรือฟังก์ชันความสูญเสีย (loss functions) เป็นเกณฑ์ในการกำหนดค่าพารามิเตอร์ที่เหมาะสม

  • ประเภทที่สองเรียกว่า hyperparameter พารามิเตอร์ประเภทนี้มีหน้าที่ควบคุมการเรียนรู้ของโมเดลทำนาย ทำให้ความยืดหยุ่น/ความซับซ้อนของโมเดลเปลี่ยนแปลงไป ซึ่งส่งผลโดยตรงต่อทั้งประสิทธิภาพในการทำนายของโมเดล และความรวดเร็วในการเรียนรู้ของโมเดล โมเดลทำนายแต่ละตัวจะมี hyperparameter ที่แตกต่างกัน เช่น k-nearest neighbor มี hyperparameter จำนวน 1 ตัวคือ k หรือจำนวนค่าสังเกตที่อยู่ใกล้กันมากที่สุด หรือ decision tree มี hyperparameters เช่น ความลึกสูงสุดของตันไม่ (max_depth) จำนวนหน่วยข้อมูลต่ำสุดในแต่ละ leaf node (min_sample_split) …

Model Training

  • การประมาณ/กำหนดค่าพารามิเตอร์ดังกล่าวให้เหมาะสม จำเป็นที่จะต้องพิจารณา generalization error ของโมเดลทำนายด้วย อย่างไรก็ตามในขั้นตอนการพัฒนาโมเดลทำนายจะใช้เฉพาะ training dataset เท่านั้น (ทำไม?)

คำถามคือ การประเมิน generalization error ด้วย training dataset สามารถทำได้อย่างไร?

  • validation method

  • resampling methods

Validation method

Resampling methods

Resampling methods

  • k-fold cross validation

  • bootstrapping

k-fold cross validation (k-fold CV)

  • เป็นเทคนิคการสุ่มซ้ำเทคนิคหนึ่ง เทคนิคนี้จะแบ่งข้อมูล training dataset ออกเป็นส่วนย่อยอย่างสุ่มจำนวน k ชุด เรียกแต่ละชุดว่า fold

  • วิธีการนี้จะนำชุดข้อมูลย่อยจำนวน k-1 ชุด ไปประมาณพารามิเตอร์ในโมเดล และอีก 1 ชุดที่เหลือจะนำไปใช้สำหรับประเมิน generalization error ของโมเดล วิธีการนี้มีลักษณะการทำงานแบบทวนซ้ำจำนวน k รอบ โดยที่ในแต่ละรอบจะเปลี่ยนชุดข้อมูลสำหรับประมาณค่าพารามิเตอร์ และประเมิน generalization error ไปเรื่อย ๆ จนครบ

  • จากขั้นตอนในข้างต้นจะทำให้ได้ค่า generalization error จำนวน k ค่า เขียนแทนด้วย \(\epsilon_1, \epsilon_2, ..., \epsilon_k\) ค่า generalization error ของโมเดลทำนายคำนวณได้จากค่าเฉลี่ยของ generalization error ที่คำนวณได้จากการทวนซ้ำในแต่ละรอบ

k-fold cross validation (k-fold CV)

5-fold CV (Boehmke, & Greenwell, 2020)

k-fold cross validation (k-fold CV)

  • หน่วยข้อมูลแต่ละหน่วยจะอยู่ในชุดข้อมูลทดสอบเพียงครั้งเดียวเท่านั้น

  • การกำหนดค่า k ไม่ได้มีกฎเกณฑ์ตายตัว แต่โดยปกติมักกำหนดให้ k=5 หรือ k=10

  • ยิ่งกำหนดให้ k มีค่ามาก จะส่งผลให้ความแปรปรวนในการประมาณ generalization error มีแนวโน้มลดลง และถ้า k=n เมื่อ n คือจำนวนหน่วยข้อมูลทั้งหมด อัลกอริิทึม k-fold CV จะเทียบเท่า leave-one-out CV (LOOCV)

  • k=10 ให้ค่าประมาณ generalization error ที่ใกล้เคียงกับ LOOCV (Molinaro et al., 2005)

  • repeating k-fold CV ใช้การทวนซ้ำกระบวนการ k-fold CV หลาย ๆ รอบ ซึ่งช่วยลดความแปรปรวนในการประมาณ generalization error ได้มากขึ้น (Kim, 2009)

k-fold cross validation

bootstrapping

bootstrapping process (Boehmke, & Greenwell, 2020)

bootstrapping: bootstrap samples

  • Bootstrap sample คือตัวอย่างที่ได้จากการสุ่มแบบใส่คืน (random sampling with replacement) จากชุดข้อมูลตั้งต้น

  • จากการสร้าง bootstrap sample ข้างต้นจะเห็นว่าหน่วยข้อมูลแต่ละหน่วยสามารถปรากฏอยู่ใน bootstrap sample ได้มากกว่าหนึ่งครั้ง แตกต่างจาก k-fold CV ที่หน่วยข้อมูลแต่ละหน่วยจะปรากฏอยู่เพียง fold ใด fold หนึ่งเท่านั้น

  • และเนื่องจาก bootstrap sample สร้างจากการสุ่มตัวอย่างแบบใส่คืนจากชุดข้อมูลตั้งต้น จึงทำให้ลักษณะการแจกแจงของข้อมูลใน bootstrap sample มีลักษณะโดยประมาณเป็นการแจกแจงเดียวกับข้อมูลในชุดข้อมูลตั้งต้น

bootstrapping: out-of-bag (OOB)

  • เมื่อพิจารณาในแต่ละ bootstrap sample เปรียบเทียบกับชุดข้อมูลตั้งต้นจะพบว่าสามารถจำแนกหน่วยข้อมูลได้เป็น 2 ประเภท ประเภทแรกคือหน่วยข้อมูลที่ถูกสุ่มมาใส่ใน bootstrap sample หน่วยข้อมูลกลุ่มนี้จะนำไปใช้วิเคราะห์ภายใต้โมเดลทำนายที่กำหนด ส่วนประเภทที่สองคือหน่วยข้อมูลที่ไม่ถูกสุ่มมาไว้ใน bootstrap sample เรียกหน่วยข้อมูลกลุ่มนี้ว่า out-of-bag (OOB) หน่วยข้อมูลประเภทนี้จะนำไปใช้ประมาณค่า generalization error ของโมเดลทำนาย ในทำนองเดียวกับ k-fold CV

  • วิธี bootstrapping เป็นวิธีการที่ให้ค่าประมาณ generalization error ที่มีความแปรปรวนต่ำกว่าวิธี k-fold CV อย่างไรก็ตามในกรณีที่ชุดข้อมูลตั้งต้นมีขนาดเล็ก วิธี bootstrapping อาจให้ค่าประมาณความคลาดเคลื่อนที่ลำเอียง (bias)

bootstrapping

Bias and Variance trace-off

Generalization error ของแต่ละโมเดลทำนายประกอบด้วยส่วนประกอบ 3 ส่วนได้แก่ ความลำเอียง (bias) ความแปรปรวน (variance) และตัวรบกวน (noise) หรือในหนังสือบางเล่มเรียกว่าความคลาดเคลื่อนที่ลดทอนไม่ได้ (irreducible error) ความคลาดเคลื่อนแต่ละส่วนมีความหมายที่แตกต่างกัน ดังนี้

  • ความลำเอียง –> ในทางทฤษฎี bias = E(\(\hat{theta}\))-\(theta\) ความคลาดเคลื่อนส่วนนี้เกิดขึ้นจาก misspecification ของโมเดล โมเดลทำนายที่มีความลำเอียงสูง ๆ มีแนวโน้มที่จะเป็น underfitting model

  • ความแปรปรวน –> ความไวของการเปลี่ยนแปลงของค่าทำนายจากโมเดล ที่เกิดจากการเปลี่ยนแปลงเงื่อนไข/ค่าสังเกตของตัวแปรอิสระที่ใช้เป็นตัวทำนาย โมเดลที่ค่าทำนายเปลี่ยนแปลงอย่างรวดเร็วเมื่อตัวแปรอิสระมีการเปลี่ยนแปลงเพียงเล็กน้อย มีแนวโน้มที่จะเป็นโมเดลที่มีความแปรปรวนสูง สาเหตุของการเกิดความคลาดเคลื่อนส่วนนี้เกิดจาก overfitting model

  • ตัวรบกวน (noise) เป็นความคลาดเคลื่อนจากปัจจัยแทรกซ้อน ซึ่งเกิดได้จากหลายสาเหตุ เช่น ความคลาดเคลื่อนจากการสุ่มตัวอย่าง ค่าผิดปกติ ความคลาดเคลื่อนจากการบันทึกข้อมูล สเกลของข้อมูลไม่ถูกต้อง ความคลาดเคลื่อนส่วนนี้สามารถลดทอนได้ด้วยการตรวจสอบทำความสะอาดข้อมูลก่อนนำไปวิเคราะห์

Bias and Variance trace-off

โมเดลที่มีความซับซ้อนสูงมีแนวโน้มที่จะมีความลำเอียงต่ำ แต่ก็มีแนวโน้มที่จะมีความแปรปรวนสูงด้วย ในทางกลับกันโมเดลที่มีความซับซ้อนต่ำก็จะมีแนวโน้มที่จะมีความลำเอียงสูง แต่มีความแปรปรวนต่ำ

Bias and Variance trace-off

Hyperparameter tuning

อย่างที่กล่าวไว้ข้างต้น hyperparameter เป็นส่วนประกอบของโมเดลทำนายที่ใช้ควบคุมการเรียนรู้ของโมเดล ซึ่งจะส่งผลโดยตรงต่อความซับซ้อนของโมเดล ดังนั้นการกำหนด hyperparameter ที่เหมาะสมจึงช่วยในการ trade-off ความลำเอียงและความแปรปรวนของโมเดลทำนาย อย่างไรก็ตามไม่ใช่ทุกอัลกอริทึมที่จะมี hyperparameter เสมอไป

การหาค่าที่เหมาะสมของ hyperparameter จะใช้วิธีการทดลองกำหนดค่าของ hyperparameter ภายใต้กรอบที่กำหนด จากนั้นพิจารณา generalization error ของโมเดลเมื่อกำหนด hyperparameter ดังกล่าว และเลือกค่าที่ทำให้ generalization error มีค่าต่ำที่สุด

Hyperparameter tuning: KNN algorithm

K-Nearest Neighbors (K-NN) อัลกอริทึมนี้เป็นอัลกอริทึมพื้นฐานที่ใช้สำหรับทำนายกลุ่มหรือจำแนกประเภทของหน่วยข้อมูล ซึ่งบ่อยครั้งสามารถทำได้อย่างมีประสิทธิภาพ แนวคิดพื้นฐานของอัลกอริทึม K-NN คือการบันทึกข้อมูล feature และ labels ของหน่วยข้อมูลใน training data เอาไว้ และใช้ข้อมูลที่บันทึกนี้สำหรับการทำนายหน่วยข้อมูลใหม่ โดยจะนำ feature ของหน่วยข้อมูลใหม่มาเปรียบเทียบกับ training data ที่บันทึกเอาไว้ จากนั้นหาหน่วยข้อมูลใน training data ที่มีลักษณะของ feature ใกล้เคียงกับหน่วยข้อมูลใหม่มากที่สุดขึ้นมาจำนวน K ค่า จากนั้นนำ labels ของหน่วยข้อมูลทั้ง K ค่า มาหาฉันทามติซึ่งจะใช้เป็นค่าทำนาย label ของหน่วยข้อมูลใหม่

Hyperparameter tuning: KNN algorithm

  • อัลกอริทึม K-NN มี hyperparameter จำนวน 1 ตัว ได้แก่ K หรือจำนวนหน่วยข้อมูลที่มีคุณลักษณะใกล้เคียงกับหน่วยข้อมูลที่ต้องการทำนายมากที่สุด ในทางทฤษฎีค่า K เป็นพารามิเตอร์ที่ใช้กำหนดความซับซ้อนของโมเดล กล่าวคือยิ่ง K มีค่าน้อยโมเดลจะยิ่งมีความยืดหยุ่นหรือมีความไวต่อการเปลี่ยนแปลงในความสัมพันธ์ของข้อมูลมาก ในทางกลับกันหาก K มีค่ามาก อัลกอริทึมจะมีความไวต่อการเปลี่ยนแปลงหรือความสัมพันธ์ของข้อมูลลดลง ทำให้โมเดลมีความซับซ้อนลดลงไปด้วย

  • การกำหนดค่า K ที่น้อยเกินไปอาจส่งผลให้โมเดลทำนายมีแนวโน้มเป็น overfitting model ในทางกลับกันการกำหนด K ที่มากเกินไปก็อาจส่งผลให้โมเดลทำนายมีแนวโน้มเป็น underfitting model อย่างไรก็ตามการกำหนดค่า K ดังกล่าวไม่สามารถประมาณได้โดยตรงจากข้อมูล ในทางปฏิบัติจะใช้เทคนิคการสุ่มซ้ำ (resampling technique) เช่น cross-validation หรือ bootstrap เพื่อค้นหาและระบุค่า K ที่เหมาะสมมากที่สุด

Hyperparameter tuning: KNN algorithm

Hyperparameter tuning: KNN algorithm

รูปต่อไปนี้แสดงโมเดล KNN เมื่อกำหนดค่า hyperparameter k ต่าง ๆ กัน

Example

head(iris,3)
iris.scale<-iris
iris.scale[,1:4]<-scale(iris[,1:4], center=TRUE, scale=TRUE)
head(iris.scale,3)
set.seed(123)
train.id<-createDataPartition(iris.scale$Species, p=0.8,
                              list=FALSE, times=1)
train.dat<-iris.scale[train.id,]
test.dat<-iris.scale[-train.id,]

control<-trainControl(method="repeatedcv", number=10, repeats=5,
                      classProbs = TRUE,
                      summaryFunction  = multiClassSummary)
fit.knn<-train(Species~., data=train.dat,
               method="knn",
               trControl=control,
               tuneLength=20)
plot(fit.knn)

Example

head(iris,3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
iris.scale<-iris
iris.scale[,1:4]<-scale(iris[,1:4], center=TRUE, scale=TRUE)
head(iris.scale,3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1   -0.8976739   1.0156020    -1.335752   -1.311052  setosa
## 2   -1.1392005  -0.1315388    -1.335752   -1.311052  setosa
## 3   -1.3807271   0.3273175    -1.392399   -1.311052  setosa

Example

Hyperparameter tuning

การเฟ้นหาค่าของ hyperparameter ที่เหมาะสมมีหลายวิธีการ

  • grid search (or full cartesion grid search)

  • random grid searches (Bergstra and Bendio, 2012)

  • adaptive resamping via futility analysis (Kuhn, 2014)

Model Evaluation

  • การประเมินประสิทธิภาพของโมเดลเชิงสถิติอาจจำแนกเป็นสองลักษณะ ลักษณะแรกคือการพิจารณาจากค่าของดัชนีวัดความสอดคล้องเชิงประจักษ์ (goodness of fit indices) และการวิเคราะห์เศษเหลือ (residuals analysis) การประเมินลักษณะนี้ไม่เหมาะกับการประเมินประสิทธิภาพในการทำนายของโมเดล ทั้งนี้เป็นเพราะผลการวิเคราะห์ที่ได้นั้น ไม่ได้บ่งชี้ประสิทธิภาพในการทำนายของโมเดลโดยตรง

  • ลักษณะที่สองคือ การประเมินประสิทธิภาพของโมเดลด้วย loss function โดยที่ loss function คือดัชนีที่บ่งชี้ความแตกต่าง/ความสอดคล้องกันระหว่างค่าทำนายกับค่าจริงของตัวแปรตาม

Model Evaluation: Loss function

  • loss function หรืออาจเรียกอีกชื่อว่าฟังก์ชันวัตถุประสงค์ เป็นสิ่งที่ผู้วิเคราะห์กำหนดไว้ก่อนการวิเคราะห์เพื่อใช้เป็นเกณฑ์อ้างอิงในอัลกอริทึมสำหรับประมาณค่าพารามิเตอร์ของโมเดลเชิงสถิติ กล่าวง่าย ๆ คืออัลกอริทึมสำหรับประมาณค่าพารามิเตอร์จะพยายามหาค่าประมาณพารามิเตอร์ที่ทำให้ค่า loss function มีค่าต่ำที่สุด (minimized loss function) หรือในบางกรณีอาจทำให้มีค่าสูงสุดก็ได้

loss function มีหลายตัวและเลือกใช้แตกต่างกันออกไปขึ้นอยู่กับโมเดลทำนายที่ผู้วิเคราะห์เลือกใช้ เช่น

  • linear regression ใช้ loss function เป็น \(SSE = \sum_{i=1}^n(y_i-\hat{y}_i)^2\)

  • logistic regression ใช้ loss function เป็น cross-entropy

  • decision tree อาจใช้ cross-entropy หรือ gini index เป็น loss function

Model Evaluation: Loss function

  • นอกจากใช้ประโยชน์ในเชิงของการประมาณค่าพารามิเตอร์ภายในโมเดลทำนายแล้ว loss function ยังสามารถนำมาใช้เป็นเกณฑ์การพิจารณาประสิทธิภาพของโมเดลการเรียนรู้ของเครื่องได้อีกด้วย

  • loss function จำแนกเป็นสองกลุ่ม กลุ่มแรกคือ loss function สำหรับ regression problem และกลุ่มที่สองคือ loss function สำหรับ classification problem

Model Evaluation: Regression Problem

  • \(MSE=\frac{1}{n}\sum_{i=1}^n(y_i-\hat{y}_i)^2\)

  • \(RMSE = \sqrt{MSE}\)

  • \(Deviance=-2lnL_{proposed model}+2lnL_{saturated model}\) เรียกว่า residual deviance จากนิยามจะเห็นว่า residual deviance ใช้วัดว่าโมเดลทำนายของผู้วิเคราะห์สามารถอธิบาย/ทำนายได้แตกต่างไปจาก saturated model (full model) มากน้อยเพียงใด

  • \(MAE = \frac{1}{n}\sum_{i=1}^n|y_i-\hat{y}_i|\)

  • \(R^2=cor(y_i, \hat{y}_i)^2\)

Model Evaluation: Classification Problem

  • Misclassification –> average prediction error

  • Cross-entropy (หรือ Log Loss หรือ Deviance

  • Gini index

  • Confusion matrix

Entropy

Entropy

  • low probability event (ถ้าจะเกิดคือบังเอิญเกิด) –> high entropy

  • high probability event (ค่อนข้างแน่นอนที่จะเกิด) –> low entropy

class = [dropout, not]

  • สมมุติว่าโมเดลทำนายว่า \(P(y_i=drop)=1.00 \implies P(y_i=not)=.00\) ดังนั้น entropy ของการทำนายนี้จะมีค่าต่ำมาก \(\rightarrow 0\)

  • สมมุติว่าโมเดลทำนายว่า \(P(drop)=.4\) จะเห็นว่ามีความไม่แน่นอนสูงในการทำนายการ dropout ของนักเรียน ดังนั้น entropy ของการทำนายนี้จะมีค่าสูง

Cross-Entropy

  • cross-entropy หรือ log loss เป็นดัชนีสำหรับวัดประสิทธิภาพในการทำนายของ classification model ประเภทที่ให้ค่าทำนายเป็นความน่าจะเป็น \(p_i \in [0,1]\)

  • ความหมายของ cross-entropy เป็นการวัดความแตกต่างกัน (error) ระหว่างค่าความน่าจะเป็นที่ได้จากโมเดลทำนายกับค่าจริงของตัวแปรตามที่สนใจ

  • ยกตัวอย่างเช่น ในการทำนายการออกกลางคันของนักเรียน หากโมเดลทำนายความน่าจะเป็นในการออกกลางคันของนักเรียนคนหนึ่งเป็น \(p(y_1=drop)=0.8\) และค่าจริงของนักเรียนคนนี้คือออกกลางคันจริง กรณีนี้ cross-entropy จะมีค่าต่ำ

  • ในทางกลับกันหากนักเรียนคนที่สองถูกทำนายว่ามีความน่าจะเป็นที่จะออกกลางคันเป็น \(p(y_2=drop)=0.12\) แต่ในความเป็นจริงนักเรียนคนนี้ออกกลางคัน กรณีนี้ค่า cross-entropy จะมีค่าสูง

  • โมเดลทำนายที่ทำนายได้อย่างสมบูรณ์จะมีค่า cross-entropy เท่ากับ 0.00

Cross-Entropy

Cross-Entropy

  • binary classification
\(-y_iln(p_i)+(1-y_i)ln(1-p_i)\)


  • multiclass classification
\(\sum_{c=1}^My_{i,c}ln(p_{i,c})\)

Confusion Matrix

Confusion Matrix

  • \(Accuracy = \frac{TP+TN}{total}\)

  • \(Precision = \frac{TP}{TP+FP}\)

  • \(Sensitivity = \frac{TP}{TP+FN}\)

  • \(Specificity = \frac{TN}{TN+FP}\)

  • \(AUC\)

Confusion Matrix: ROC curve and AUC

  • ROC เป็นกราฟที่พล็อตแกน X เป็น FP และแกน Y เป็น TP หรือในหลายกรณีมักใช้แกน X เป็น 1-specificity และแกน Y เป็น sensitivity

  • ROC ใช้แสดงทัศนภาพของการ trace-off กันระหว่างสถานการณ์ที่โมเดลทำนายมีคุณสมบัติ TP = 100% กับสถานการณ์ที่โมเดลทำนายมีคุณสมบัติ TP = 0% ดังรูป

Confusion Matrix: ROC curve and AUC

ROC สามารถใช้สำหรับเปรียบเทียบประสิทธิภาพของโมเดลทำนายหลาย ๆ โมเดลได้ ดังรูป

Confusion Matrix: ROC curve and AUC

\(AUC\) = พื้นที่ใต้กราฟ ROC ใช้บ่งชี้ความแม่นยำในการทำนายของโมเดล

  • AUC = 0.9

  • AUC = 0.5

  • AUC = 0.3

Feature Filtering

  • ในหลาย ๆ การวิเคราะห์ ผู้วิเคราะห์อาจพบว่ามีตัวแปรอิสระที่เกี่ยวข้องจำนวนมาก ข้อดีของการมีตัวแปรอิสระจำนวนมากคือผู้วิเคราะห์มีสารสนเทศจำนวนมากที่สามารถนำมาทำนายตัวแปรตามที่สนใจ อย่างไรก็ตามในความเป็นจริงแล้ว การมีตัวแปรอิสระจำนวนมากเกินไปในโมเดลมักทำให้การประมวลผลทำได้ช้า การอธิบายแปลความหมายจากโมเดลทำได้ยาก นอกจากนี้ยังมีโอกาสสูงที่ตัวแปรอิสระบางตัวจะไม่มีสารสนเทศเพียงพอที่จะใช้เป็นตัวแปรทำนาย

  • อัลกอริทึมบางตัวมีความสามารถในการคัดเลือกตัวแปรอิสระได้ด้วยตนเอง เช่น tree-based models หรือ lasso regression แต่หลายอัลกอริทึมก็ไม่มีความสามารถดังกล่าว

Feature Filtering: ZV and NZV

Feature Filtering: ZV and NZV

  • Zero-variance predictors คือตัวแปรอิสระที่ไม่มีความแปรปรวน

  • Zero-variance predictors คือตัวแปรอิสระที่มีความแปรปรวนน้อยมาก การจัดว่าตัวแปรอิสระที่พิจารณาเป็นตัวแปรประเภท NZV หรือไม่ จะพิจารณาจากเกณฑ์ 2 ด้านได้แก่ (1) อัตราส่วนระหว่างความถี่ของค่าสังเกตที่เกิดขึ้นบ่อยที่สุดต่อความถี่ของค่าสังเกตที่เกิดขึ้นน้อยที่สุด (frequency ratio) และ (2) ร้อยละของค่าสังเกตที่มีค่าซ้ำ

iris%>%caret::nearZeroVar(saveMetrics=TRUE)
##              freqRatio percentUnique zeroVar   nzv
## Sepal.Length  1.111111      23.33333   FALSE FALSE
## Sepal.Width   1.857143      15.33333   FALSE FALSE
## Petal.Length  1.000000      28.66667   FALSE FALSE
## Petal.Width   2.230769      14.66667   FALSE FALSE
## Species       1.000000       2.00000   FALSE FALSE

Example

Regression problem

  • linear regression

  • principal component regression (PCR)

  • partial least square regression (PLR)

Classification problem

  • logistic regression

  • KNN algorithm